Telegram Group Search
👨‍💻 Облегчаем поиск работы

В карточках рассказали о действиях, которые мешают найти работу в ИТ, особенно в начале карьеры.

➡️ Подробнее в статье

🐸 Библиотека мобильного разработчика
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔎 Wordsearch: узнаем, кто самый внимательный

В этой головоломке спрятаны 9 терминов из мира мобильной разработки.

Правила просты:

— Найдите 9 слов в сетке (слова идут по горизонтали)
— Напишите в комментариях, какие слова вы нашли
— Объясните один из терминов так, чтобы даже джун понял

🏆 Кто первым найдет все 9 слов и объяснит хотя бы один термин — получит почетный статус Mobile Guru на неделю!

Погнали 👇

🐸 Библиотека мобильного разработчика

#междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
✉️ Топ-вакансий для мобильных разработчиков за неделю

iOS Разработчик от 4000 до 8000 $, удалёнка

Flutter-разработчикдо 3 200 $, удалёнка

iOS-разработчикгибрид (Москва)

React Native разработчикгибрид (Москва)

iOS-разработчикгибрид (Новосибирск, Томск)

➡️ Еще больше топовых вакансий — в нашем канале Mobile jobs

🐸 Библиотека мобильного разработчика

#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
🛠 How to: реализовать бесконечную ленту как в TikTok

Проблема:

При быстром скролле лента тормозит, а видео подгружаются с задержкой. Как сделать плавную работу?

Решение:

1️⃣ Используйте RecyclerView + Paging 3 (Android)

// Настройка PagingSource
class VideoPagingSource : PagingSource<Int, Video>() {
override suspend fun load(params: LoadParams<Int>): LoadResult<Int, Video> {
val page = params.key ?: 0
return try {
val response = api.getVideos(page)
LoadResult.Page(
data = response.videos,
prevKey = if (page == 0) null else page - 1,
nextKey = if (response.isLastPage) null else page + 1
)
} catch (e: Exception) {
LoadResult.Error(e)
}
}
}


2️⃣ Оптимизируйте видео-плеер (iOS/Android)

🔵 Предзагрузка: Загружайте следующее видео в фоне, пока пользователь смотрит текущее
🔵 Кеширование: Сохраняйте последние 5 просмотренных видео в памяти

3️⃣ Гибридный подход к пагинации

func loadMoreVideosIfNeeded(currentIndex: Int) {
if currentIndex == videos.count - 2 { // Предзагрузка при приближении к концу
loadNextPage()
}
}


4️⃣ Ленивая инициализация плеера

val videoViews = mutableListOf<VideoView>().apply {
repeat(3) { add(VideoView(context)) } // Только 3 плеера в памяти
}


💡 Важные нюансы:

 Приоритет сети: WiFi > 5G > 4G (адаптируйте качество видео)
 Очистка ресурсов: Останавливайте воспроизведение невидимых видео
 Аналитика: Отслеживайте, какие видео досматривают до конца

🐸 Библиотека мобильного разработчика 

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🤫 Тёмные уголки обфускации R8 и ProGuard

Обфускация — важная часть защиты Android-приложений. Однако даже R8 или ProGuard не гарантируют высокой устойчивости к тому что ваш код не взломают. Стандартная настройка обфускации довольно простая и нацелена на уменьшение размера сборки, а не повышение защиты от взлома.

В этой статье автор разбирает как происходит обфускация в стандартной конфигурации, как можно её сделать сложнее для разбора, а по итогу и уникальной для каждой сборки.

👉 Читать статью

🐸 Библиотека мобильного разработчик

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
Инструмент недели: ProgressUI

ProgressUI — это пакет SwiftUI, реализующий легко настраиваемый круговой индикатор прогресса. Он поддерживает динамическое окрашивание в зависимости от уровня прогресса, а также предлагает несколько вариантов размеров.

Благодаря плавной анимации, этот индикатор идеально подходит для отображения процессов, состояний загрузки или индикаторов состояния в приложениях для iOS, macOS, watchOS, visionOS и tvOS.

💻 ProgressUI на GitHub

🐸 Библиотека мобильного разработчика

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🥵 Устали от статей, где эйчары рассказывают, как на самом деле выглядит рынок труда в ИТ?

Мы тоже! Поэтому решили узнать правду и представить ее всем айтишникам — но нам нужен ваш голос. Опрос займет 3 минуты, а пользы — вагон для всего сообщества.

Результаты этого исследования помогут понять, как специалистам искать работу в 2025-м (а компаниям — специалистов).

👉 Если вы готовы сделать свой вклад в исследование — велком: https://clc.to/VGgyNA
🌐 Отложенная инициализация свойств

Отложенная инициализация свойств — это механизм, который позволяет отложить инициализацию переменных до момента их первого использования.

Этот вариант позволяет экономить ресурсы, т.к. избегает необходимости создания объектов при инициализации класса.

➡️ lateinit

Модификатор lateinit говорит о том, что данная переменная будет инициализирована позже. При этом инициализировать свойство можно из любого места, откуда она видна.

Правила использования модификатора lateinit:

🔵 lateinit может использоваться только с var свойствами класса;

🔵 lateinit может быть применен только к свойствам, объявленным внутри тела класса (но не в основном конструкторе), а также к переменным на верхнем уровне и локальным переменным;

🔵 lateinit свойства могут иметь любой тип, кроме примитивных типов (таких как Int, Long, Double и т.д.);

🔵 lateinit свойства не могут быть nullable (т.е. обязательно должно быть объявлены без знака вопроса);

🔵 lateinit свойства не могут быть проинициализированы сразу при их объявлении;

🔵 lateinit свойства должны быть инициализированы до первого обращения к ним, иначе будет выброшено исключение UninitializedPropertyAccessException;

🔵 Нельзя использовать lateinit для переменных, определенных внутри локальных областей видимости (например, внутри функций);

🔵 При использовании модификатора lateinit у свойства не должно быть пользовательских геттеров и сеттеров.

Для проверки факта инициализации переменной вызывайте метод isInitialized(). Функцию следует использовать экономно — не следует добавлять эту проверку к каждой переменной с отложенной инициализацией. Если вы используете isInitialized() слишком часто, то скорее всего вам лучше использовать тип с поддержкой null.

lateinit var catName: String

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

setContentView(R.layout.activity_main)

catName = "Barsik"

if (::catName.isInitialized) {
Log.d("Kot", "Hi, $catName")
}
}


А вы используете lateinit в своих проектах? 💬

🐸 Библиотека мобильного разработчика

#междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
🚀 git cherry-pick – переносим отдельные коммиты между ветками

Знакомая ситуация? Вы исправили баг в feature-branch, но нужно срочно добавить этот фикс в main без мержа всей ветки.

Вот как это работает:

git cherry-pick <hash-коммита>  # переносит указанный коммит в текущую ветку


Пример использования:

1. Нашли коммит с нужным исправлением:

git log feature-branch --oneline  # копируем хеш коммита


2. Переключились на main и применили его:

git checkout main
git cherry-pick abc1234


💡 Когда пригодится:

🔵 Срочные фиксы – перенос исправления из разработки в прод без полного мержа.
🔵 Частичные обновления – нужно взять только один коммит из чужой ветки.
🔵 Ошибки в ветвлении – забыли сделать коммит в нужной ветке? cherry-pick спасает!

Вы уже использовали cherry-pick? Делитесь кейсами в комментариях 👇

🐸 Библиотека мобильного разработчика

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
2025/05/23 17:36:23
Back to Top
HTML Embed Code: